package main

import "fmt"

func main() {

	fmt.Println("切片语法初始=================================================================================")
	fmt.Println()

	//语法结构 var 切片名 []类型 = 数组的一个片段引用
	var intarr [6]int = [6]int{1, 2, 3, 4, 5, 6}
	// 切片定义在数组之上
	// [1:3]切片 - 切出的是一段代码 - 索引：从1开始，到3结束（不包含3）-[1，3]s
	slice := intarr[1:3] //{2,3}
	// 输出数组
	fmt.Println("intarr: ", intarr)
	// 输出切片
	fmt.Println("slice: ", slice)
	// 切片元素个数
	fmt.Println("切片元素个数slice: ", len(slice))
	// 切片元素容量
	fmt.Println("s切片元素容量lice: ", cap(slice))

	fmt.Printf("数组中下表为1位置的地址：", &intarr[1])
	fmt.Printf("切片中下标为0的位置地址：", &slice[0])
	slice[1] = 16
	fmt.Println("slice[1] = 16intarr: ", intarr)
	fmt.Println("slice[1] = 16slice: ", slice)
	fmt.Println()

	fmt.Println("切片定义===================================================================================")
	fmt.Println()
	// 方式1：定义一个切片，然后让切片去引用一个已经创建好的数组。
	var intarr1 [3]int = [3]int{1, 2, 3}
	slice1 := intarr1[0:2]
	fmt.Println("intarr1: ", intarr1)
	fmt.Println("slice1: ", slice1)

	// 方式2：通过make内置函数来创建切片。基本语法: var切片名[type = make([], len,[cap])
	// make三个参数含义 1：切片类型，2：切片长度，3：切片容量
	slice2 := make([]int, 4, 20)
	fmt.Println(slice2)
	fmt.Println("切片的长度：", len(slice2))
	fmt.Println("切片的容量：", cap(slice2))
	slice2[0] = 66
	slice2[1] = 88
	fmt.Println("slice2", slice2)

	//方式3：定一个切片，直接就指定具体数组，使用原理类似make的方式。
	slice3 := []int{7, 8, 9}
	fmt.Println(slice3)
	fmt.Println("切片的长度：", len(slice3))
	fmt.Println("切片的容量：", cap(slice3))
	fmt.Println()

	fmt.Println("切片的遍历===================================================================================")
	fmt.Println()

	// 定义切片
	slice5 := make([]int, 4, 20)
	slice5[0] = 66
	slice5[1] = 88
	slice5[2] = 99
	slice5[3] = 100
	for i := 0; i < len(slice5); i++ {
		fmt.Printf("slice[%v] = %v \t", i, slice5[i])
	}
	fmt.Println()
	for key, value := range slice5 {
		fmt.Printf("下标：%v ，元素：%v\n", key, value)
	}
	fmt.Println()

	fmt.Println("切片注意事项===================================================================================")
	fmt.Println()

	var intarr2 [6]int = [6]int{1, 2, 3, 4, 5, 6}
	var slice6 []int = intarr2[1:4] //2,3,4
	fmt.Println("切片后的值：", slice6)
	slice7 := slice6[1:2] //3
	fmt.Println("再次切片后的值：", slice7)
	slice7[0] = 66
	fmt.Println(intarr2)
	fmt.Println(slice6)
	fmt.Println(slice7)

	// 动态增长
	fmt.Println("append动态增长===================================================================================")

	//
	var intarr3 [6]int = [6]int{4, 5, 6, 7, 8, 9}
	var slice8 []int = intarr3[1:4]
	fmt.Println(len(slice8), cap(slice8))
	slice9 := append(slice8, 88, 50, 89)
	intarr3[2] = 99
	fmt.Printf("slice9:%v, 长度:%v，容量:%v，\n", slice9, len(slice9), cap(slice9))
	fmt.Println(slice8)
	fmt.Println(intarr3)

	fmt.Println("切片copy===================================================================================")
	fmt.Println()

	//定义切片：
	var a []int = []int{1, 4, 7, 3, 6, 9}
	//再定义一个切片：
	var b []int = make([]int, 10)
	//将a中对应数组中元素内容复制到b中对应的数组中
	copy(b, a)
	fmt.Println(b)

	// 在切片头部插入值
	var aa []int = make([]int, 3, 5)
	aa[0] = 100
	aa[1] = 200
	aa[2] = 300
	fmt.Println(aa)

	aaa := append(aa, 400)
	fmt.Println(aaa)
	fmt.Println("----", aa)

	aaaa := append(aa, 500)
	fmt.Println(aaaa)
	fmt.Println(aaa)
	fmt.Println("====", aa)
}
